package com.cloud.common.core.utils;

import org.apache.commons.lang3.StringUtils;

import java.security.MessageDigest;

/**
 * 加密工具
 *
 * @author yan
 */
public class EncryptUtils {

    /**
     * 默认32位加密
     *
     * @param plainText 加密内容
     * @return
     */
    public static String toMD5(String plainText) {
        return toMD5(plainText, 32);
    }

    /**
     * MD5加密
     *
     * @param plainText 加密内容
     * @param md5Type   位数：16/32
     * @return
     */
    public static String toMD5(String plainText, Integer md5Type) {
        try {
            // 生成实现指定摘要算法的 MessageDigest 对象。
            MessageDigest md = MessageDigest.getInstance("MD5");
            // 使用指定的字节数组更新摘要。
            md.update(plainText.getBytes());
            // 通过执行诸如填充之类的最终操作完成哈希计算。
            byte b[] = md.digest();
            // 生成具体的md5密码到buf数组
            int i;
            StringBuffer buf = new StringBuffer("");
            for (int offset = 0; offset < b.length; offset++) {
                i = b[offset];
                if (i < 0) {
                    i += 256;
                }
                if (i < 16) {
                    buf.append("0");
                }
                buf.append(Integer.toHexString(i));
            }
            if (md5Type == 16) {
                return buf.toString().substring(8, 24);
            } else if (md5Type == 32) {
                return buf.toString();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 隐藏字符串 填充 *
     *
     * @param str
     * @return
     */
    public static String hideMidStr(String str) {
        return hideMidStr(str, '*');
    }

    /**
     * 隐藏字符串
     *
     * @param str  字符串
     * @param fill 填充物
     * @return
     */
    public static String hideMidStr(String str, char fill) {
        if (StringUtils.isBlank(str)) {
            return str;
        }
        //小于2个的字符串没必要加密
        if (str.length() < 2) {
            return str;
        }
        int hideSize = (int) (str.length() * 0.4);
        int hideStart = (int) Math.round(str.length() * 0.25);
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (i >= hideStart && i <= hideStart + hideSize) {
                c = fill;
            }
            sb.append(c);
        }
        return sb.toString();
    }
}
